home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / tools / czesc_3 / nopaz / nopaz.c < prev    next >
C/C++ Source or Header  |  1992-06-17  |  7KB  |  321 lines

  1. /*  :ts=8 bk=0
  2.  *
  3.  * nopaz.c:    Slaughter Topaz forever!
  4.  *
  5.  *        Compile under SAS/C 5.10b with:
  6.  *        lc -cq -v -rr -L nopaz.c
  7.  *
  8.  * Leo L. Schwab            (415) 903-9321    9205.29
  9.  */
  10. #include <exec/types.h>
  11. #include <exec/memory.h>
  12. #include <graphics/text.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16.  
  17. #include <proto/exec.h>
  18. #include <proto/dos.h>
  19. #include <proto/graphics.h>
  20. #include <proto/diskfont.h>
  21.  
  22.  
  23. /***************************************************************************
  24.  * Forward function prototypes.  (I hate ANSI.)
  25.  */
  26. void main (int, char **);
  27. char *checkfont (int);
  28. void removenopaz (void);
  29. void copyfont (struct TextFont *, struct TextFont *);
  30. struct FontPort *createfontport (void);
  31. void deletefontport (struct FontPort *);
  32. void openstuff (void);
  33. void closestuff (void);
  34. void die (char *);
  35.  
  36.  
  37. /***************************************************************************
  38.  * Structure definition.
  39.  */
  40. struct FontPort {
  41.     struct MsgPort    fp_MsgPort;
  42.     struct TextFont    fp_OldTopaz;
  43.     struct TextFont    *fp_Replacer;
  44.     char        fp_PortName[8];    /*  "_nopaz"  */
  45. };
  46.  
  47.  
  48. /***************************************************************************
  49.  * Data.
  50.  */
  51. struct TextAttr    topaz = {
  52.     (STRPTR) "topaz.font",
  53.     8,
  54.     FS_NORMAL,
  55.     0
  56. };
  57.  
  58. struct TextFont        *topaztf, *tf;
  59. char            portname[] = "_nopaz";
  60. char            err_openfail[] = "Couldn't open Topaz (!).\n";
  61.  
  62. struct GfxBase        *GfxBase;
  63. struct Library        *DiskfontBase;
  64.  
  65. char            usage[] = "\0$VER: \
  66. Nopaz 1.0 (8.6.92) -- Replace Topaz imagery.\n\
  67. Written by Leo L. Schwab.\n\
  68. This program is freely distributable.\n\
  69. \n\
  70. \2331mUSAGE:\233m\n\
  71. \tNopaz <fontname> [ <pointsize> ] ; Replace Topaz imagery.\n\
  72. \tNopaz -q\t\t\t ; Restore original Topaz imagery.\n\
  73. ";
  74.  
  75.  
  76. /***************************************************************************
  77.  * Code.
  78.  */
  79. void
  80. main (ac, av)
  81. int    ac;
  82. char    **av;
  83. {
  84.     struct FontPort    *fp;
  85.     struct TextAttr    ta;
  86.     int        ysize;
  87.     char        *err, name[40];
  88.  
  89.     if (ac < 2)
  90.         die (&usage[7]);
  91.  
  92.     openstuff ();
  93.  
  94.     /*
  95.      * Check to see if we're to remove changes.
  96.      */
  97.     if (!stricmp (av[1], "-q")) {
  98.         removenopaz ();
  99.         goto cleanexit;
  100.     }
  101.  
  102.     /*
  103.      * Collect arguments.
  104.      */
  105.     strcpy (name, av[1]);
  106.     strcat (name, ".font");
  107.  
  108.     if (ac >= 3) {
  109.         ysize = atoi (av[2]);
  110.         if (!ysize)
  111.             die ("Bad point size.\n");
  112.     } else
  113.         ysize = 8;
  114.  
  115.     /*
  116.      * Create TextAttr structures and open fonts.
  117.      */
  118.     topaz.ta_YSize = ysize;
  119.     if (!(topaztf = OpenFont (&topaz)))
  120.         die (err_openfail);
  121.     if (!(topaztf->tf_Flags & FPF_ROMFONT))
  122.         die ("Disk-based copies of Topaz cannot be replaced.\n");
  123.  
  124.     ta.ta_Name    = name;
  125.     ta.ta_YSize    = ysize;
  126.     ta.ta_Style    = FS_NORMAL;
  127.     ta.ta_Flags    = FPF_ROMFONT | FPF_DISKFONT | FPF_DESIGNED;
  128.  
  129.     if (tf = OpenFont (&ta))
  130.         if (checkfont (ysize)) {
  131.             CloseFont (tf);
  132.             tf = NULL;
  133.         }
  134.  
  135.     if (!tf) {
  136.         if (!(tf = OpenDiskFont (&ta)))
  137.             die ("Failed to open requested font.\n");
  138.         if (err = checkfont (ysize))
  139.             die (err);
  140.     }
  141.  
  142.     /*
  143.      * Well, I *guess* it's okay...  Create placeholder.
  144.      */
  145.     if (!(fp = createfontport ()))
  146.         die ("Can't create FontPort.\n");
  147.     CopyMem (topaztf, &fp->fp_OldTopaz, sizeof (*topaztf));
  148.     fp->fp_Replacer = tf;
  149.  
  150.     /*
  151.      * Obliterate Topaz.  (Ahhhhh.....)
  152.      */
  153.     copyfont (tf, topaztf);
  154.     tf = NULL;            /*  Prevent it from unloading.    */
  155.  
  156. cleanexit:
  157.     closestuff ();
  158.     exit (0);
  159. }
  160.  
  161. char *
  162. checkfont (ysize)
  163. int    ysize;
  164. {
  165.     /*
  166.      * Sanity checks.
  167.      */
  168.     if (tf->tf_YSize != ysize)
  169.         return ("Requested font size not available.\n");
  170.  
  171.     if (tf->tf_XSize & FPF_PROPORTIONAL  ||
  172.         tf->tf_CharSpace  ||
  173.         tf->tf_CharKern)
  174.         return ("Proportional fonts not allowed.\n");
  175.  
  176.     if (tf->tf_Style & FSF_COLORFONT)
  177.         return ("Color fonts not allowed.\n");
  178.  
  179.     if (tf->tf_YSize != topaztf->tf_YSize  ||
  180.         tf->tf_XSize != topaztf->tf_XSize)
  181.         return ("Size mismatch between Topaz and requested font.\n");
  182.  
  183.     return (NULL);
  184. }
  185.  
  186. void
  187. removenopaz ()
  188. {
  189.     register struct FontPort    *fp;
  190.  
  191.     while (fp = FindPort (portname)) {
  192.         /*
  193.          * Open the version of Topaz that we stepped on.
  194.          */
  195.         topaz.ta_YSize = fp->fp_OldTopaz.tf_YSize;
  196.         if (!(topaztf = OpenFont (&topaz)))
  197.             die (err_openfail);
  198.         if (topaztf->tf_YSize != fp->fp_OldTopaz.tf_YSize)
  199.             die ("Restoration size mismatch!\n");
  200.  
  201.         /*
  202.          * Put Topaz back.  (Why?)
  203.          */
  204.         copyfont (&fp->fp_OldTopaz, topaztf);
  205.  
  206.         /*
  207.          * Close the font we opened to replace it.
  208.          */
  209.         CloseFont (fp->fp_Replacer);
  210.         CloseFont (topaztf), topaztf = NULL;
  211.  
  212.         /*
  213.          * Free the placeholder.
  214.          */
  215.         deletefontport (fp);
  216.     }
  217. }
  218.  
  219.  
  220. /***************************************************************************
  221.  * Copies only the relevant fields of the TextFont structure over.
  222.  * Forces the destination to FPF_ROMFONT.
  223.  */
  224. void
  225. copyfont (src, dest)
  226. register struct TextFont    *src, *dest;
  227. {
  228.     dest->tf_YSize        = src->tf_YSize;
  229.     dest->tf_XSize        = src->tf_XSize;
  230.     dest->tf_Style        = src->tf_Style;
  231.     dest->tf_Baseline    = src->tf_Baseline;
  232.     dest->tf_BoldSmear    = src->tf_BoldSmear;
  233.     dest->tf_LoChar        = src->tf_LoChar;
  234.     dest->tf_HiChar        = src->tf_HiChar;
  235.     dest->tf_CharData    = src->tf_CharData;
  236.     dest->tf_Modulo        = src->tf_Modulo;
  237.     dest->tf_CharLoc    = src->tf_CharLoc;
  238.  
  239.     src->tf_Flags    |= dest->tf_Flags & FPF_ROMFONT;
  240.     dest->tf_Flags    = src->tf_Flags & ~FPF_DISKFONT;
  241. }
  242.  
  243.  
  244. /***************************************************************************
  245.  * FontPort handling.  FontPorts are used as placeholders, if the user
  246.  * should for some preposterous reason wish to restore the original Topaz
  247.  * imagery.
  248.  */
  249. struct FontPort *
  250. createfontport ()
  251. {
  252.     register struct FontPort    *fp;
  253.  
  254.     if (!(fp = AllocMem (sizeof (*fp), MEMF_CLEAR | MEMF_PUBLIC)))
  255.         return (NULL);
  256.  
  257.     fp->fp_MsgPort.mp_Node.ln_Name    = fp->fp_PortName;
  258.     fp->fp_MsgPort.mp_Node.ln_Pri    = 0;
  259.     fp->fp_MsgPort.mp_Node.ln_Type    = NT_MSGPORT;
  260.     fp->fp_MsgPort.mp_Flags        = PA_IGNORE;
  261.     strcpy (fp->fp_PortName, portname);
  262.  
  263.     AddPort (fp);
  264.     return (fp);
  265. }
  266.  
  267. void
  268. deletefontport (fp)
  269. register struct FontPort    *fp;
  270. {
  271.     register void    *msg;
  272.  
  273.     if (fp) {
  274.         RemPort (fp);
  275.  
  276.         /*
  277.          * Just in case someone got cute.
  278.          */
  279.         while (msg = GetMsg (fp))
  280.             ReplyMsg (msg);
  281.  
  282.         FreeMem (fp, sizeof (*fp));
  283.     }
  284. }
  285.  
  286.  
  287. /***************************************************************************
  288.  * Housekeeping.
  289.  */
  290. void
  291. openstuff ()
  292. {
  293.     if (!(GfxBase = OpenLibrary ("graphics.library", 0)))
  294.         die ("Can't open graphics.\n");
  295.  
  296.     if (!(DiskfontBase = OpenLibrary ("diskfont.library", 0)))
  297.         die ("Can't open diskfont.library.\n");
  298. }
  299.  
  300. void
  301. closestuff ()
  302. {
  303.     if (tf)            CloseFont (tf);
  304.     if (topaztf)        CloseFont (topaztf);
  305.     if (DiskfontBase)    CloseLibrary (DiskfontBase);
  306.     if (GfxBase)        CloseLibrary (GfxBase);
  307. }
  308.  
  309. void
  310. die (str)
  311. char *str;
  312. {
  313.     extern long    Output();
  314.     register LONG    fh;
  315.  
  316.     if (fh = Output ())
  317.         Write (fh, str, (long) strlen (str));
  318.     closestuff ();
  319.     exit (20);
  320. }
  321.